home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga CD-ROM Collection
/
Amiga CD-ROM Collection - Auge 4000 and Cactus and Demo Util.iso
/
auge4000
/
46
/
lib
/
fd
/
open.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-06-20
|
2KB
|
120 lines
/*
* OPEN.C
*
* (c)Copyright 1990, Matthew Dillon, All Rights Reserved
*/
#include <exec/types.h>
#include <libraries/dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
_IOFDS *
_MakeFD(pfd)
int *pfd;
{
int fd;
_IOFDS *d;
/*
* extend limit if required
*/
for (fd = 0, d = _IoFD; fd < _IoFDLimit; ++fd) {
if ((d->fd_Flags & O_ISOPEN) == 0)
break;
++d;
}
if (fd == _IoFDLimit) {
short newLimit = fd + 5;
_IOFDS *fds = malloc(sizeof(_IOFDS) * newLimit);
if (fds == NULL) {
errno = ENOMEM;
return(NULL);
}
_slow_bzero(fds, sizeof(_IOFDS) * newLimit);
_slow_bcopy(_IoFD, fds, sizeof(_IOFDS) * fd);
if (_IoFD != _IoStaticFD)
free(_IoFD);
_IoFD = fds;
_IoFDLimit = newLimit;
d = fds + fd;
}
if (d)
_slow_bzero(d, sizeof(*d));
*pfd = fd;
return(d);
}
int
open(name, modes)
const char *name;
int modes;
{
int fd;
_IOFDS *d = _MakeFD(&fd);
if (d == NULL)
return(-1);
/*
* If we can't lock then be careful to call Open only once. Don't
* bother to open if the IoErr() returns ERROR_DEVICE_NOT_MOUNTED
*/
{
long lock = Lock(name, SHARED_LOCK);
if (lock == NULL) {
if (IoErr() == ERROR_DEVICE_NOT_MOUNTED) {
errno = ENOFILE;
return(-1);
}
/*
* file does not exist, open modes 1006 if create request, else
* try to open modes 1005 (could be a non-file device)
*/
if (modes & O_CREAT)
d->fd_Fh = Open(name, 1006);
else
d->fd_Fh = Open(name, 1005);
if (d->fd_Fh == NULL) {
errno = ENOFILE;
return(-1);
}
if (modes & O_APPEND)
Seek(d->fd_Fh, 0L, 1);
d->fd_Flags = modes | O_ISOPEN;
return(fd);
}
UnLock(lock);
}
/*
* Assume it is a normal file.. we can open/reopen it any
* number of times. Also, the file exists so...
*/
if (modes & O_TRUNC)
d->fd_Fh = Open(name, 1006);
else
d->fd_Fh = Open(name, 1005);
if (d->fd_Fh == NULL && (modes & O_CREAT)) /* case should never happen? */
d->fd_Fh = Open(name, 1006);
if (d->fd_Fh) {
if (modes & O_APPEND)
Seek(d->fd_Fh, 0L, 1);
d->fd_Flags = modes | O_ISOPEN;
return(fd);
}
return(-1);
}